/**
 * 项目结构绘制器
 */
define(function(require, exports, module) {
    /**
     * 绘制器sigma内核
     */
    var sigmaCore = null;
    /**
     * 绘制项目结构
     * @param {Object} nodes 点数据
     * @param {Object} edges 连线数据
     * @param {Object} contentDom 图片容器
     */
    function print(nodes, edges, nodeMap, edgeConnectTimesMap, contentDom, graphStrategy) {
        sigmaCore = new sigma(contentDom);
        //sigmaCore.graph.nodes(nodes);
        //sigmaCore.graph.edges(edges);
        initNodesGraph(nodes, nodeMap, graphStrategy)
        sigmaCore.graph.read({
            nodes: nodes,
            edges: edges
        });
        //设置最大放大倍数
        sigmaCore.settings({
            zoomMax : 10
        })
        //启动布局调整
        sigmaCore.startForceAtlas2();
        //启动绘制刷新
        sigmaCore.refresh();
    }
    

    /**
     * 初始化node图像数据
     * @param {Object} nodes
     */
    function initNodesGraph(nodes, nodeMap, graphStrategy) {
        for(var i = 0, length = nodes.length; i < length; i++) {
            initNodePosition(nodes[i], i, length, nodeMap[nodes[i].id], graphStrategy.position);
            initNodeSize(nodes[i], nodeMap[nodes[i].id]);
            initNodeColor(nodes[i], nodeMap[nodes[i].id]);
            initNodeLabel(nodes[i], nodeMap[nodes[i].id]);
        }
    }
    
    /**
     * 位置策略
     */
    var graphPositionStrategy = {
        /**
         * 随机策略生成点的位置
         * @param {Object} node 点对象
         * @param {Object} index 点索引
         * @param {Object} N 点总数
         * @param {Object} distance 距离因子，用于 ‘circle’ 策略
          */
        random : function(node, index, N, distance) {
            node.x = Math.random() * 2000
            node.y = Math.random() * 1000
        },
        /**
         * 以引用次数越高越靠近圆心的策略初始化点的位置
         * @param {Object} node 点对象
         * @param {Object} index 点索引
         * @param {Object} N 点总数
         * @param {Object} distance 距离因子，用于 ‘circle’ 策略
         */
        circle : function(node, index, N, distance) {
            node.x = Math.cos(2 * index * Math.PI / N) * 10000 / (distance + 1);
            node.y = Math.sin(2 * index * Math.PI / N) * 10000 / (distance + 1);
        }
    }
    
    /**
     * 初始化node位置
     * @param {Object} node 点对象
     * @param {Object} index 点索引
     * @param {Object} N 点总数
     * @param {Object} distance 距离因子
     * @param {Object} positionStrategy 位置策略
     */
    function initNodePosition(node, index, N, distance, positionStrategy) {
        graphPositionStrategy[positionStrategy](node, index, N, distance);
    }
    
    /**
     * 初始化点大小
     * @param {Object} node
     * @param {Object} size
     */
    function initNodeSize(node, size) {
        node.size = size * 2;
        if(size > 100) node.size = 100 //防止过大点影响显示效果
    }
    
    /**
     * 初始化节点标签
     * @param {Object} node 节点对象
     * @param {Object} size 节点引用次数信息
     */
    function initNodeLabel(node, size) {
       node.label = "文件路径：" + node.id + "\n" +
                    "文件引用次数: " + size
       
    }
    
    /**
     * 初始化节点颜色
     * @param {Object} node 节点对象
     * @param {Object} colorPoint 节点因子
     */
    function initNodeColor(node, colorPoint) {
        node.color = '#' + (
            Math.floor(colorPoint/25 * 16777215).toString(16) + '000000'
        ).substr(0, 6)
    }

    return {
        print: print
        sigmaCore : sigmaCore
    }
})